<?php

!defined('IN_NOVA') && exit('Access Denied!');

class Cache {

	// 缓存类型
	public $type;

	// 缓存变量
	public $cache;

	// 缓存配置
	public $options;

	function __construct() {
		if( !defined( 'CACHE_TIMEOUT' ) ) {
			defined( 'CACHE_TIMEOUT', 60 );
		} else {
			if( !is_integer( CACHE_TIMEOUT ) || CACHE_TIMEOUT < 0 ) {
				throw new NovaException( L( '_CACHE_TIMEOUT_ILLEGAL_' ), E_ERROR );
			}
		}
		$this->cache = array();
	}

    function __set( $name, $value ) {
        $this->set( $name, $value, CACHE_TIMEOUT );
    }

    function __get( $name ) {
        return $this->get( $name );
    }

	// 增加或修改一个缓存变量
    public function set( $index, $value = '', $timeout = 0 ) {
    	$this->cache[$index]['edit'] = TRUE;
    	$this->cache[$index]['time'] = PHP_TIME;
    	$this->cache[$index]['timeout'] = $timeout;
	   	$this->cache[$index]['value'] = $value;
    }

    // 获取一个缓存变量
	public function get( $index ) {
		//[DEBUG]
		global $log;
		//[/DEBUG]
		if( !isset( $this->cache[$index] ) ) {
			//[DEBUG]
			if( defined( 'APP_DEBUG' ) && APP_DEBUG === TRUE ) {
				$log->add( '[' . __FILE__ . '] [' . __LINE__ . '] ' . L( '_USE_ILLEGAL_INDEX_' ) . ' ' . $index, E_USER_NOTICE );
			}
			//[/DEBUG]
			return NULL;
		}
		// 假如不开启缓存
		if( !defined( 'CACHE_ENABLE' ) || CACHE_ENABLE !== TRUE ) {
			return NULL;
		}
		// 假如开启缓存
		$this->refresh( $index );
		if( isset( $this->cache[$index]['value'] ) ) {
			return $this->cache[$index]['value'];
		} else {
			return NULL;
		}
	}

	// 获取所有缓存
	public function get_all() {
		// 假如不开启缓存
		if( !defined( 'CACHE_ENABLE' ) || CACHE_ENABLE !== TRUE ) {
			return NULL;
		}
		// 假如开启缓存
		$this->refresh_all();
		return $this->cache;
	}

	// 刷新一条缓存
	// 参数 $p 为 TRUE 时 强制刷新
	public function refresh( $index, $p = FALSE ) {
		//[DEBUG]
		global $log;
		//[/DEBUG]
		if( !isset( $this->cache[$index] ) ) {
			//[DEBUG]
			if( defined( 'APP_DEBUG' ) && APP_DEBUG === TRUE ) {
				$log->add( '[' . __FILE__ . '] [' . __LINE__ . '] ' . L( '_USE_ILLEGAL_INDEX_' ) . ' ' . $index, E_USER_NOTICE );
			}
			//[/DEBUG]
			return;
		}
		// 假如不开启缓存
		if( !defined( 'CACHE_ENABLE' ) || CACHE_ENABLE !== TRUE ) {
			return;
		}
		// 假如开启缓存
		if( ( $this->cache[$index]['timeout'] > 0 && ( $this->cache[$index]['time'] + $this->cache[$index]['timeout'] ) <= PHP_TIME ) || $p ) {
	    	$this->cache[$index]['edit'] = TRUE;
    		$this->cache[$index]['time'] = PHP_TIME;
	   		$this->cache[$index]['value'] = NULL;
		}
	}

	// 刷新整个缓存
	// 参数 $p 为 TRUE 时 强制刷新
	public function refresh_all( $p = FALSE ) {
		$keys = array_keys( $this->cache );
		foreach ( $keys as $index ) {
			$this->refresh( $index, $p );
		}
	}

	// 删除一条缓存
	public function delete($index) {
		//[DEBUG]
		global $log;
		//[/DEBUG]
		if( !isset( $this->cache[$index] ) ) {
			//[DEBUG]
			if( defined( 'APP_DEBUG' ) && APP_DEBUG === TRUE ) {
				$log->add( '[' . __FILE__ . '] [' . __LINE__ . '] ' . L( '_USE_ILLEGAL_INDEX_' ) . ' ' . $index, E_USER_NOTICE );
			}
			//[/DEBUG]
			return;
		}
		unset( $this->cache[$index] );
	}

	// 删除整个缓存
	public function delete_all($index) {
		$this->cache = array();
	}

	// 获取缓存方式
	public function get_type() {
		return $this->type;
	}

	// 获取配置信息
	public function get_options() {
		return $this->options;
	}
}
?>
